import gradio as gr
from ultralytics import YOLO
from components.c_config import app_config

# 模型路径和类别名称
# MODEL_SAVE_PATH = "model/Fall-Detection.pt"
CLASS_NAMES = ['person', 'down','10+','dog']

# 模型实例
model = YOLO(f"model/{app_config.display.model}.pt")

def detect_fall(img):
    """跌倒检测推理函数
    输入参数：
        img: 待检测图像（监控画面）
    输出：
        vis_img: 带标注的可视化图像
        analysis: 包含状态、事件类型和置信度的分析报告
    """
    
    results = model(img)
    
    # 可视化结果增加透明度
    vis_img = results[0].plot(conf=0.5, labels=False)[:, :, ::-1]  # 降低置信度阈值至0.5
    
    # 增强统计信息
    # 修改分析报告结构
    analysis = {
        "当前状态": "✅ 正常",  # 默认状态
        "检测事件": {},
        "置信度分布": {}
    }
    
    # 解析检测结果（添加跌倒事件判断）
    fall_detected = False
    for box in results[0].boxes:
        cls_id = int(box.cls)
        conf = float(box.conf)
        cls_name = results[0].names[cls_id]
        
        # 记录检测事件和置信度
        analysis["检测事件"].setdefault(cls_name, 0)
        analysis["检测事件"][cls_name] += 1
        
        analysis["置信度分布"].setdefault(cls_name, [])
        analysis["置信度分布"][cls_name].append(conf)

    
    # 计算平均置信度
    for cls_name, confs in analysis["置信度分布"].items():
        analysis["置信度分布"][cls_name] = round(sum(confs)/len(confs), 2)
    
    # 根据检测事件设置状态（替换原有健康状态判断）
    if analysis["检测事件"].get("down", 0) > 0:
        analysis["当前状态"] = "⚠️ 有人摔倒"
    else:
        analysis["当前状态"] = "✅ 正常"
    
    return vis_img, analysis

def create_ui():
    """创建监控系统界面"""
    with gr.Blocks(title="跌倒检测系统") as demo:
        gr.Markdown("## 🚨 智能跌倒检测系统")
        with gr.Row():
            with gr.Column():
                input_img = gr.Image(type="filepath", label="上传监控画面")
                gr.Examples(
                    examples=[
                        "resources/people(21).jpg",
                        "resources/people(535).jpg",
                    ],
                    inputs=input_img
                )
                detect_btn = gr.Button("开始分析", variant="primary")
            with gr.Column():
                output_img = gr.Image(label="检测结果")
                output_json = gr.JSON(label="分析报告")
        
        detect_btn.click(
            fn=detect_fall,
            inputs=input_img,
            outputs=[output_img, output_json]
        )
    return demo


def run():
    create_ui().launch(
        server_name="127.0.0.1",
        # server_port=7861,  # 端口指定
        server_port=app_config.display.server_port,
        show_error=True    # 显示详细错误信息
    )